#include <bits/types/FILE.h>

#include <cstdio>
#include <functional>
#include <iostream>
#include <memory>

/*
std::unique_ptr和std::shared_ptr都支持提供自定义的删除器，这在使用智能指针管理其它资源时，是必要的。
比如，使用new[]分配到连续内存，或者文件句柄等资源，都可以自定义删除器来释放资源
*/

template <typename T>
class MyDeletor {
public:
    void operator()(T* ptr) const {
        std::cout << "call MyDeletor::operator()(T*)" << std::endl;
        delete[] ptr;
    }
};

template <typename T>
class MyFileDeletor {
public:
    void operator()(T* ptr) const {
        std::cout << "call MyFileDeletor::operator()(T*)" << std::endl;
        fclose(ptr);
    }
};

int main() {
    // 1. 定义额外的删除器类
    std::unique_ptr<int, MyDeletor<int>> pi(new int[10]);
    std::unique_ptr<FILE, MyFileDeletor<FILE>> pf(fopen("data.txt", "w"));

    // 2. 使用lambda表达式实现同样效果, 更加灵活推荐使用
    std::unique_ptr<int, std::function<void(int*)>> pi2(
        new int[10], [](int* ptr) {
            std::cout << "using lambda delete[]" << std::endl;
            delete[] ptr;
        });

    std::unique_ptr<FILE, std::function<void(FILE*)>> pf2(
        fopen("data1.txt", "w"), [](FILE* ptr) {
            std::cout << "using lambda fclose" << std::endl;
            fclose(ptr);
        });
    return 0;
}
